/**
 * 日期范围处理工具函数
 * 用于处理 uni-datetime-picker 返回的日期范围，确保查询能够正确包含结束日期当天的所有数据
 */

/**
 * 处理日期范围，确保开始时间为当天00:00:00，结束时间为当天23:59:59
 * @param dateRange uni-datetime-picker 返回的日期范围数组
 * @returns 处理后的日期数组 [startDate, endDate]
 */
export function processDateRange(dateRange: any[]): Date[] {
  if (!Array.isArray(dateRange) || dateRange.length !== 2) {
    throw new Error('日期范围必须是包含两个元素的数组');
  }

  const [startDateStr, endDateStr] = dateRange;

  // 创建开始日期，设置为当天的 00:00:00
  const startDate = new Date(startDateStr);
  startDate.setHours(0, 0, 0, 0);

  // 创建结束日期，设置为当天的 23:59:59.999
  const endDate = new Date(endDateStr);
  endDate.setHours(23, 59, 59, 999);

  return [startDate, endDate];
}

/**
 * 处理单个日期范围字段
 * @param filterParams 筛选参数对象
 * @param fieldKey 字段键名
 * @returns 处理后的日期数组或 null
 */
export function processDateRangeField(
  filterParams: Record<string, any>,
  fieldKey: string
): Date[] | null {
  const dateRange = filterParams[fieldKey];

  if (!dateRange || !Array.isArray(dateRange) || dateRange.length !== 2) {
    return null;
  }

  return processDateRange(dateRange);
}

/**
 * 批量处理多个日期范围字段
 * @param filterParams 筛选参数对象
 * @param fieldMappings 字段映射 { 前端字段名: 后端字段名 }
 * @returns 处理后的查询参数对象
 */
export function processMultipleDateRangeFields(
  filterParams: Record<string, any>,
  fieldMappings: Record<string, string>
): Record<string, Date[]> {
  const result: Record<string, Date[]> = {};

  Object.entries(fieldMappings).forEach(([frontendKey, backendKey]) => {
    const processedRange = processDateRangeField(filterParams, frontendKey);
    if (processedRange) {
      result[backendKey] = processedRange;
    }
  });

  return result;
}

/**
 * 格式化日期范围用于显示
 * @param dateRange 日期范围数组
 * @returns 格式化后的字符串
 */
export function formatDateRangeForDisplay(dateRange: Date[]): string {
  if (!Array.isArray(dateRange) || dateRange.length !== 2) {
    return '';
  }

  const [startDate, endDate] = dateRange;
  const startStr = startDate.toLocaleDateString('zh-CN');
  const endStr = endDate.toLocaleDateString('zh-CN');

  return `${startStr} 至 ${endStr}`;
}

/**
 * 验证日期范围是否有效
 * @param dateRange 日期范围数组
 * @returns 验证结果
 */
export function validateDateRange(dateRange: any[]): { valid: boolean; message: string } {
  if (!Array.isArray(dateRange)) {
    return { valid: false, message: '日期范围必须是数组' };
  }

  if (dateRange.length !== 2) {
    return { valid: false, message: '日期范围必须包含开始和结束日期' };
  }

  const [startDateStr, endDateStr] = dateRange;

  if (!startDateStr || !endDateStr) {
    return { valid: false, message: '开始日期和结束日期不能为空' };
  }

  const startDate = new Date(startDateStr);
  const endDate = new Date(endDateStr);

  if (isNaN(startDate.getTime()) || isNaN(endDate.getTime())) {
    return { valid: false, message: '日期格式无效' };
  }

  if (startDate > endDate) {
    return { valid: false, message: '开始日期不能晚于结束日期' };
  }

  return { valid: true, message: '' };
}

/**
 * 获取日期范围的天数
 * @param dateRange 日期范围数组
 * @returns 天数
 */
export function getDateRangeDays(dateRange: Date[]): number {
  if (!Array.isArray(dateRange) || dateRange.length !== 2) {
    return 0;
  }

  const [startDate, endDate] = dateRange;
  const timeDiff = endDate.getTime() - startDate.getTime();
  return Math.ceil(timeDiff / (1000 * 60 * 60 * 24)) + 1; // +1 包含结束日期当天
}
